import { PathUtils } from "./path.utils";

export class FileUtils {
    private static readonly DOC_MIME_TYPES = new Set([
        // office 文档
        "application/pdf", // PDF文件
        "application/msword", // 旧版 Word 文档 (Word 97-2003) doc
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document", // 新版 Word 文档 docx
        "application/vnd.ms-excel", // 旧版 Excel 表格 xls
        "application/vnd.openxmlformats-officedocument.spreadsheetm l.sheet", // 新版 Excel 表格 xlsx
        "application/vnd.ms-powerpoint", // 旧版 PowerPoint 演示文稿 ppt
        "application/vnd.openxmlformats-officedocument.presentationml.presentation", // 新版 PowerPoint 演示文稿 pptx

        // 其他常见文档类型
        "text/plain", // 纯文本
        "text/html", // HTML文档
        "text/css", // CSS样式表
        "text/javascript", // JavaScript脚本
        "text/csv", // CSV文件
        "text/markdown", // Markdown
        "application/json", // JSON文件
        "application/rtf", // 富文本格式
        "application/xml" // XML文件
    ]);

    /**
     * 根据文件的mimetype归类为系统定义的5种文件类型
     * @param mimetype 文件mime类型
     * @returns "audio" | "video" | "image" | "doc" | "other"
     */
    static categorizeFileByMimetype(mimetype: string): "audio" | "video" | "image" | "doc" | "other" {
        // 处理无效输入
        if (!mimetype) return "other";
        // 转换为小写以便不区分大小写进行比较
        const mime = mimetype.toLowerCase();

        if (mime.startsWith("audio/")) return "audio";
        if (mime.startsWith("video/")) return "video";
        if (mime.startsWith("image/")) return "image";
        if (this.DOC_MIME_TYPES.has(mime)) return "doc";

        return "other";
    }

    /**
     * 填充完整文件访问URL
     * @param fileUrl 文件URL `/files/abc.jpg`
     * @param origin 请求来源地址 `http://localhost:3000`
     * @param urlPrefix URL前缀 `/api/v1`
     * @returns 填充后的文件URL `http://localhost:3000/api/v1/files/abc.jpg`
     */
    static fillFullFileUrl(fileUrl: string, origin: string, urlPrefix: string): string {
        if (!fileUrl) return fileUrl;
        if (fileUrl.startsWith("http")) return fileUrl;
        return PathUtils.joinUrl(origin, urlPrefix, fileUrl);
    }
}
